package CollectDataManager;

##########################
#     OmnibusProxy       #
#    Krzysztof Ulman     #
# Politechnika Krakowska #
#      Kraków 2012       #
##########################

use strict;
use warnings;
use encoding 'utf8';

use Try::Tiny;

use ApplicationUtils;
use Database;
use ResultsUtils;
use Screen;
use SpidersManager;
use StatementsManager;

#handler do bazy
our $db;

#odpowiedzialny za zarzadzanie statements
our $statementManager;

#odpowiedzialny za zarzadzanie robotami
our $spidersManager;

#konstruktor
sub new {
	shift;
	my $self = {};
	bless $self;

	if(!$db) {
		$db = Database->new();
	}
	
	if(!$statementManager) {
		$statementManager = StatementsManager->new();
	}
	
	if(!$spidersManager) {
		$spidersManager = SpidersManager->new();
	}
	
	return $self;
}

#przygotowanie obiektu do pracy
sub prepare {
	my $self = shift;
	my $statementsNum = $statementManager->getStatementsNum($self);
	if($statementsNum > 0) {
		Screen->printAndLogInfo('Liczba fraz do pobrania: ' . $statementsNum);
		#przygotowujemy pajaki do pracy
		my $prepareResult = $spidersManager->prepare();
		if(!$prepareResult) {
			Screen->printAndLogFatal('Przygotowanie pajakow nie powiodlo sie, przerwanie dalszej pracy!');
			$statementsNum = 0;
		}
	} else {
		Screen->printAndLogWarn('Brak fraz do pobrania');
	}
	return $statementsNum;
}

#rozpoczecie wlasciwej pracy
sub doWork {
	my $self = shift;
	#pobieramy pierwsza fraze do pobrania...
	my $statementDto = $statementManager->getNextStatement();
	#...i rozpoczynnamy zabawe
	while($statementDto) {
		#oznaczenie juz zaebranych wynikow jako nieaktualne
		try {
			ResultsUtils->updateResultsBeforeCollect($statementDto);
		} catch {
			my $e = $_;
			Screen->printAndLogError('Blad podczas oznaczania starych wynikow: ' . $e);
		};
		
		#pobieranie danych z wyszukiwarek
		try {
			$spidersManager->collect($statementDto);
		} catch {
			my $e = $_;
			Screen->printAndLogError('Blad podczas obslugi frazy {' . $statementDto->getStatement() . '}: ' . $e);
		};
		
		#ozczanenie jako "nie nowe"
		try {
			$statementManager->updateStatementAfterCollect($statementDto);
		} catch {
			my $e = $_;
			Screen->printAndLogError('Blad podczas oznaczania frazy {' . $statementDto->getStatement() . '}: ' . $e);	
		};
		
		#sprawdzamy czy nie ma sygnalu przerwania pracy
		if(!$statementManager->isNextStatement() && ApplicationUtils->isStopWorkSignal()) {
			#to nam zakonczy petle
			$statementDto = undef;
		} else {
			#to pobieramy nastepna fraze i do roboty! 
			$statementDto = $statementManager->getNextStatement();
		}
	}
}

1;